from enum import IntEnum
from typing import overload, NewType, Optional, Tuple

from OCC.Core.Standard import *
from OCC.Core.NCollection import *
from OCC.Core.Geom import *
from OCC.Core.GeomAbs import *
from OCC.Core.Geom2d import *
from OCC.Core.TopAbs import *
from OCC.Core.TopTools import *
from OCC.Core.TopoDS import *
from OCC.Core.gp import *
from OCC.Core.TColStd import *
from OCC.Core.BRepBuilderAPI import *
from OCC.Core.TColgp import *
from OCC.Core.Message import *
from OCC.Core.ShapeAnalysis import *
from OCC.Core.ShapeExtend import *

class shapeconstruct:
    @overload
    @staticmethod
    def ConvertCurveToBSpline(
        C3D: Geom_Curve,
        First: float,
        Last: float,
        Tol3d: float,
        Continuity: GeomAbs_Shape,
        MaxSegments: int,
        MaxDegree: int,
    ) -> Geom_BSplineCurve: ...
    @overload
    @staticmethod
    def ConvertCurveToBSpline(
        C2D: Geom2d_Curve,
        First: float,
        Last: float,
        Tol2d: float,
        Continuity: GeomAbs_Shape,
        MaxSegments: int,
        MaxDegree: int,
    ) -> Geom2d_BSplineCurve: ...
    @staticmethod
    def ConvertSurfaceToBSpline(
        surf: Geom_Surface,
        UF: float,
        UL: float,
        VF: float,
        VL: float,
        Tol3d: float,
        Continuity: GeomAbs_Shape,
        MaxSegments: int,
        MaxDegree: int,
    ) -> Geom_BSplineSurface: ...
    @overload
    @staticmethod
    def JoinCurves(
        c3d1: Geom_Curve,
        ac3d2: Geom_Curve,
        Orient1: TopAbs_Orientation,
        Orient2: TopAbs_Orientation,
        c3dOut: Geom_Curve,
    ) -> Tuple[bool, float, float, float, float, bool, bool]: ...
    @overload
    @staticmethod
    def JoinCurves(
        c2d1: Geom2d_Curve,
        ac2d2: Geom2d_Curve,
        Orient1: TopAbs_Orientation,
        Orient2: TopAbs_Orientation,
        c2dOut: Geom2d_Curve,
        isError: Optional[bool] = False,
    ) -> Tuple[bool, float, float, float, float, bool, bool]: ...
    @staticmethod
    def JoinPCurves(
        theEdges: TopTools_HSequenceOfShape, theFace: TopoDS_Face, theEdge: TopoDS_Edge
    ) -> bool: ...

class ShapeConstruct_Curve:
    def AdjustCurve(
        self,
        C3D: Geom_Curve,
        P1: gp_Pnt,
        P2: gp_Pnt,
        take1: Optional[bool] = True,
        take2: Optional[bool] = True,
    ) -> bool: ...
    def AdjustCurve2d(
        self,
        C2D: Geom2d_Curve,
        P1: gp_Pnt2d,
        P2: gp_Pnt2d,
        take1: Optional[bool] = True,
        take2: Optional[bool] = True,
    ) -> bool: ...
    def AdjustCurveSegment(
        self, C3D: Geom_Curve, P1: gp_Pnt, P2: gp_Pnt, U1: float, U2: float
    ) -> bool: ...
    @overload
    def ConvertToBSpline(
        self, C: Geom_Curve, first: float, last: float, prec: float
    ) -> Geom_BSplineCurve: ...
    @overload
    def ConvertToBSpline(
        self, C: Geom2d_Curve, first: float, last: float, prec: float
    ) -> Geom2d_BSplineCurve: ...
    @overload
    @staticmethod
    def FixKnots(knots: TColStd_HArray1OfReal) -> bool: ...
    @overload
    @staticmethod
    def FixKnots(knots: TColStd_Array1OfReal) -> bool: ...

class ShapeConstruct_MakeTriangulation(BRepBuilderAPI_MakeShape):
    @overload
    def __init__(
        self, pnts: TColgp_Array1OfPnt, prec: Optional[float] = 0.0
    ) -> None: ...
    @overload
    def __init__(self, wire: TopoDS_Wire, prec: Optional[float] = 0.0) -> None: ...
    def Build(
        self, theRange: Optional[Message_ProgressRange] = Message_ProgressRange()
    ) -> None: ...
    def IsDone(self) -> bool: ...

class ShapeConstruct_ProjectCurveOnSurface(Standard_Transient):
    def __init__(self) -> None: ...
    def GetAdjustOverDegenMode(self) -> int: ...
    def SetAdjustOverDegenMode(self, value: int) -> None: ...
    def GetBuildCurveMode(self) -> bool: ...
    def SetBuildCurveMode(self, value: bool) -> None: ...
    @overload
    def Init(self, surf: Geom_Surface, preci: float) -> None: ...
    @overload
    def Init(self, surf: ShapeAnalysis_Surface, preci: float) -> None: ...
    def Perform(
        self,
        c3d: Geom_Curve,
        First: float,
        Last: float,
        c2d: Geom2d_Curve,
        TolFirst: Optional[float] = -1,
        TolLast: Optional[float] = -1,
    ) -> bool: ...
    def PerformByProjLib(
        self,
        c3d: Geom_Curve,
        First: float,
        Last: float,
        c2d: Geom2d_Curve,
        continuity: Optional[GeomAbs_Shape] = GeomAbs_C1,
        maxdeg: Optional[int] = 12,
        nbinterval: Optional[int] = -1,
    ) -> bool: ...
    def SetPrecision(self, preci: float) -> None: ...
    @overload
    def SetSurface(self, surf: Geom_Surface) -> None: ...
    @overload
    def SetSurface(self, surf: ShapeAnalysis_Surface) -> None: ...
    def Status(self, theStatus: ShapeExtend_Status) -> bool: ...

# harray1 classes
# harray2 classes
# hsequence classes
